package com.shujia.day15.one.obj2;


public class Operator {
    public static void main(String[] args) {
//        Skill skillObj = Skill.getSkillObj("武器大师Q技能", "跳斩");
//        skillObj.useSkill();
//        Skill skillObj1 = Skill.getSkillObj("武器大师W技能", "蓄力一击");
//        skillObj1.useSkill();
//        System.out.println(skillObj1 == skillObj);
        /*
            TODO
                当多个线程对单例对象进行调用时，该对象就是一个共有变量，对于共有变量操作时，是线程不安全的
                    如何解决问题？ => 加锁 => 对唯一的变量进行加锁操作 或者对类进行加锁操作
         */

        new ThreadSkill("线程1", "武器大师Q技能", "跳斩").start();
        new ThreadSkill("线程2", "武器大师W技能", "蓄力一击").start();
    }


    static class ThreadSkill extends Thread {
        String desc;
        String skill;

        public ThreadSkill(String name, String desc, String skill) {
            super(name);
            this.desc = desc;
            this.skill = skill;
        }

        @Override
        public void run() {
            while (true) {
                // TODO 注意：如果要对共享变量进行多线程调用，那么需要在所有的变量使用的地方进行加锁操作
                synchronized (Skill.class) {
                    Skill skillObj = Skill.getSkillObj(desc, skill);
                    System.out.println("当前线程:" + this.getName());
                    skillObj.useSkill();
                }
            }
        }
    }
}
